package com.tedu.api;

import com.sun.org.apache.xpath.internal.operations.Bool;
import org.junit.Test;

/**
 * Java面向对象---不是真正的面向对象---八大数据类型
 * 创建对象--类【属性、构造器、方法】
 * 8个包装类：针对八大基本数据类型提供对应类【方法基本上互通】
 * 不可改变的类
 * 包装类包位置：java.lang
 * 八大数据类型(不是面向对象)   针对八大基本数据类型对应包装类
 * int                   Integer   继承Number父类【抽象】
 * long                  Long      继承Number父类【抽象】
 * double                Double    继承Number父类【抽象】
 * short                 Short     继承Number父类【抽象】
 * float                 Float     继承Number父类【抽象】
 * byte                  Byte      继承Number父类【抽象】
 * char                  Character 继承Object父类
 * boolean               Boolean   继承Object父类
 */
public class packingAPI {
    @Test
    public void test() {
        int a = 1; //不是面向对象，通过【反射】实现
        //创建int类型对象：Integer构造器：引入|直接写
        Integer i = new Integer(a);
        i.toString();
    }

    /**
     * 包装类API
     * xxxValue方法==静态方法valueOf      返回值：对应数据类型
     * 作用：把包装类转换为基本数据类型的方法
     * 测试：6个包装类
     */
    @Test
    public void testxxxValue() {
        Integer i = new Integer(2);
        i.intValue();//int类型和Integer  //拆包---接收：int类型和Integer
        System.out.println(i);
        //测试：其他7个包装类
        //String s1="123.123";     Double
        //String s2="1";           Byte
        //String s3="123.123F";    Float
        //String s4="1234L";       Long
        //String s5="true";        Boolean
        //String s6="a";           Character
    }

    @Test
    public void testDouble() {
        String s1 = "123.123";
        Double d = new Double(s1);
        d = d.doubleValue();
        System.out.println(s1);
    }

    @Test
    public void testByte() {
        String s2 = "1";
        Byte b = new Byte(s2);
        b = b.byteValue();
        System.out.println(s2);
    }

    @Test
    public void testFloat() {
        String s3 = "123.123F";  //Float   ×   123.1默认double
        Float f = new Float(s3);
        f = f.floatValue();
        System.out.println(s3);
    }

    @Test
    //包装类构造器：直接传值，使用【字符串传值：Long包装认为L字符，并不是数值】
    public void testLong() {
        String s4 = "12345L";
        Long l = new Long(45678L);
        l = l.longValue();
        System.out.println(l);  //NumberFormatException数值转换异常
    }

    @Test
    public void testBoolean() {
        String s5 = "true";
        Boolean b = new Boolean(s5);
        b = b.booleanValue();
        System.out.println(s5);
    }

    @Test
    public void testCharacter() {
        char s6 = 'a';
        Character c = new Character(s6);
        c = c.charValue();
        System.out.println(s6);
    }

    /**
     * 包装类具备静态方法
     * valueOf   返回值：对应数据类型
     * 作用：把打包类转换为基本数据类型的方法
     */
    @Test
    public void testValueOf() {
        int i = Integer.valueOf(1);//打包拆包一体化
        Boolean.valueOf(true);
        char c = Character.valueOf('1');
        Float.valueOf(1.123F);//1.123默认 double 编译工具
    }

    /**
     * 包装类--------------Servlet[JavaBean]
     * public class Person{
     * Integer id;  //成员 ---解析
     * }
     * parseXXX()
     * 作用：获取到的字符串转换为对应类型
     */
    @Test
    public void testParseXXX() {
        String s = "123";//将字符串转换为整形
        int i = Integer.parseInt(s);//区别：解析字符串，转换为正确类型
        int is = Integer.valueOf(s);//区别：存入值，打包拆包获取值
        System.out.println(i == is);
        //将整形转换为字符串
        String s1 = String.valueOf(123);//与包装类，用法一致，实现不一致
        //自己测：把 String s2="456f"   char s='a'   顺利转出
        String s2 = "456f";
        float f = Float.parseFloat(s2);
        System.out.println(f);
        //char s='a'不行  原因：没有针对字符解析

    }

    /**
     * 自动拆装箱
     * JDK1.5之前没有自动拆装箱
     * JDK1.5之后有自动拆装箱  出现于2004年
     */
    Integer in = Integer.valueOf(1);//装箱
    int ii = in.intValue();//拆箱
    //JDK1.5之后有自动拆装箱
    Integer i = 1;
    int is = i;
    //编译器帮我们写了拆装箱过程---JVM虚拟机只认1.5之前的写法
}
